package com.proyecto.miniplan.server;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import javax.jdo.Query;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.proyecto.miniplan.client.ProyectoService;
import com.proyecto.miniplan.shared.ProyectoDTO;
import com.proyecto.miniplan.shared.TareaDTO;

public class ProyectoServiceImpl extends RemoteServiceServlet implements ProyectoService{

	private static final PersistenceManagerFactory PMF =
	      JDOHelper.getPersistenceManagerFactory("transactions-optional");
	
	@Override
	public Long nuevoProyecto(String _usuario, String _nombre,
			String _descripcion) {
		// TODO Auto-generated method stub
		PersistenceManager pm = getPersistenceManager();
		
		Proyecto nuevo = new Proyecto(_usuario, _nombre, _descripcion);
	    try {
	      pm.makePersistent(nuevo);
	    } finally {
	      pm.close();
	    }
	    return nuevo.getID();
	}

	@Override
	public void eliminarProyecto(Long _id, String _usuario) {
		// TODO Auto-generated method stub
		PersistenceManager pm = getPersistenceManager();
		try {
		      Query q = pm.newQuery(Proyecto.class);
		      q.setFilter("id == proyParam");
		      //q.setOrdering("id asc");
		      q.declareParameters("Long proyParam");
		      List<Proyecto> resultados = (List<Proyecto>) q.execute(_id);
		      
		      if (resultados.iterator().hasNext()) {
		    	  for (Proyecto proy : resultados) {
			          //deleteCount++;
		    		  //if(_id == proy.getID())
			          pm.deletePersistent(proy);
			    	  //proyectosDTO.add(new ProyectoDTO(proy.getID(),proy.getUsuario(), proy.getNombre(),proy.getDescripcion(), false));
			      }
		        } else {
		            // ... no results ...
		        }
		      

		    } finally {
		      pm.close();
		    }
		    PersistenceManager pm2 = getPersistenceManager();
		    try {
			      Query q = pm2.newQuery(Tarea.class);
			      q.setFilter("proyecto == proyectoParam");
			      //q.setOrdering("id asc");
			      q.declareParameters("Long proyectoParam");
			      List<Tarea> resultados = (List<Tarea>) q.execute(_id);
			      
			      if (resultados.iterator().hasNext()) {
			    	  for (Tarea tar : resultados) {
				          //deleteCount++;
				          pm2.deletePersistent(tar);
				    	  //tareasDTO.add(new TareaDTO(tar.getID(),tar.getProyecto(), tar.getNombre(), tar.getInicio(), tar.getFin(), tar.getDuracion()));
				      }
			        } else {
			            // ... no results ...
			        }
			      

			    } finally {
			      pm2.close();
			    }
	}

	@Override
	public void actualizarProyecto(Long _id, String _usuario, String _nombre,
			String _descripcion) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public ArrayList<ProyectoDTO> abrirProyectos(String _usuario) {
		// TODO Auto-generated method stub
		PersistenceManager pm = getPersistenceManager();
		ArrayList<ProyectoDTO> proyectosDTO = new ArrayList<ProyectoDTO>();
		
	    try {
	      Query q = pm.newQuery(Proyecto.class);
	      q.setFilter("usuario == usuarioParam");
	      //q.setOrdering("id asc");
	      q.declareParameters("String usuarioParam");
	      List<Proyecto> resultados = (List<Proyecto>) q.execute(_usuario);
	      
	      if (resultados.iterator().hasNext()) {
	    	  for (Proyecto proy : resultados) {
		          //deleteCount++;
		        //  pm.deletePersistent(proyecto);
		    	  proyectosDTO.add(new ProyectoDTO(proy.getID(),proy.getUsuario(), proy.getNombre(),proy.getDescripcion(), false));
		      }
	        } else {
	            // ... no results ...
	        }
	      

	    } finally {
	      pm.close();
	    }
		return proyectosDTO;
	}

	@Override
	public Long nuevaTarea(Long _proyecto, String _nombre, int _duracion,
			Date _inicio, Date _fin) {
		// TODO Auto-generated method stub
		PersistenceManager pm = getPersistenceManager();
		Tarea nueva = new Tarea(_proyecto, _nombre, _duracion, _inicio, _fin);
	    try {
	      pm.makePersistent(nueva);
	    } finally {
	      pm.close();
	    }
	    return nueva.getID();
	}

	@Override
	public void eliminarTarea(Long _id, String _proyecto) {
		// TODO Auto-generated method stub
		PersistenceManager pm = getPersistenceManager();
	    try {
	      long deleteCount = 0;
	      Query q = pm.newQuery(Tarea.class, "proyecto == _proyecto");
	      q.declareParameters("String _proyecto");
	      List<Tarea> tareas = (List<Tarea>) q.execute(_proyecto);
	      for (Tarea tarea : tareas) {
	        if (_id.equals(tarea.getID())) {
	          deleteCount++;
	          pm.deletePersistent(tarea);
	        }
	      }
	      if (deleteCount != 1) {
	        //LOG.log(Level.WARNING, "removeStock deleted "+deleteCount+" Stocks");
	      }
	    } finally {
	      pm.close();
	    }
	}

	@Override
	public void actualizarTarea(Long _id, String _nombre, int _duracion,
			Date _inicio, Date _fin) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public ArrayList<TareaDTO> abrirTarea(Long _proyecto) {
		// TODO Auto-generated method stub
		PersistenceManager pm = getPersistenceManager();
		ArrayList<TareaDTO> tareasDTO = new ArrayList<TareaDTO>();
		
	    try {
	      Query q = pm.newQuery(Tarea.class);
	      q.setFilter("proyecto == proyectoParam");
	      //q.setOrdering("id asc");
	      q.declareParameters("Long proyectoParam");
	      List<Tarea> resultados = (List<Tarea>) q.execute(_proyecto);
	      
	      if (resultados.iterator().hasNext()) {
	    	  for (Tarea tar : resultados) {
		          //deleteCount++;
		        //  pm.deletePersistent(proyecto);
		    	  tareasDTO.add(new TareaDTO(tar.getID(),tar.getProyecto(), tar.getNombre(), tar.getInicio(), tar.getFin(), tar.getDuracion()));
		      }
	        } else {
	            // ... no results ...
	        }
	      

	    } finally {
	      pm.close();
	    }
		return tareasDTO;
	}

	private PersistenceManager getPersistenceManager() {
	    return PMF.getPersistenceManager();
	}
	
	public ProyectoDTO CvProyDTO(Proyecto original){
		ProyectoDTO nuevo = new ProyectoDTO(original.getID(),original.getUsuario(), original.getNombre(), original.getDescripcion(), false);
		return nuevo;
	}

	@Override
	public void guardarProyecto(Long _id, List<TareaDTO> _tareas) {
		List<TareaDTO> tars = new ArrayList<TareaDTO>();
		tars = _tareas;
		PersistenceManager pm = getPersistenceManager();
		// TODO Auto-generated method stub
		try {
		      Query q = pm.newQuery(Tarea.class);
		      q.setFilter("proyecto == proyectoParam");
		      //q.setOrdering("id asc");
		      q.declareParameters("Long proyectoParam");
		      List<Tarea> resultados = (List<Tarea>) q.execute(_id);
		      
		      if (resultados.iterator().hasNext()) {
		    	  for (Tarea tar : resultados) {
			          //deleteCount++;
			          pm.deletePersistent(tar);
			    	  //tareasDTO.add(new TareaDTO(tar.getID(),tar.getProyecto(), tar.getNombre(), tar.getInicio(), tar.getFin(), tar.getDuracion()));
			      }
		        } else {
		            // ... no results ...
		        }
		    } finally {
		      pm.close();
		    }
			//int i=0;
		    PersistenceManager pmt = getPersistenceManager();
		    try {
			if (tars.iterator().hasNext()) {
	    	  for (TareaDTO tar : tars) {
				//nuevaTareaP(_id, tar.nombre, 0, tar.inicio, tar.fin);
				//Window.alert(nombre + " " + String.valueOf(duracion) + " " + String.valueOf(inicio) + " " + String.valueOf(fin));
				
					Tarea nueva = new Tarea(_id, tar.nombre, tar.duracion, tar.inicio, tar.fin);
				      pmt.makePersistent(nueva);
				      
		      }
	        } else {
	            // ... no results ...
	        }
		    } finally {
			      pmt.close();
			    }
	}
	
	public void nuevaTareaP(Long _proyecto, String _nombre, int _duracion,
			Date _inicio, Date _fin) {
		// TODO Auto-generated method stub
		PersistenceManager pm = getPersistenceManager();
		Tarea nueva = new Tarea(_proyecto, _nombre, _duracion, _inicio, _fin);
	    try {
	      pm.makePersistent(nueva);
	    } finally {
	      pm.close();
	    }
	}

	@Override
	public void actualizarNombreProyecto(Long _id, String _nombre) {
		PersistenceManager pm = getPersistenceManager();
		try {
		      Query q = pm.newQuery(Proyecto.class);
		      q.setFilter("id == proyParam");
		      q.declareParameters("Long proyParam");
		      List<Proyecto> resultados = (List<Proyecto>) q.execute(_id);
		      
		      if (resultados.iterator().hasNext()) {
		    	  for (Proyecto proy : resultados) {
			          
			          proy.setNombre(_nombre);
			          
			    	  
			      }
		        } else {
		            // ... no results ...
		        }
		      

		    } finally {
		      pm.close();
		    }	
	}
	
	
	public void actualizarDescripcionProyecto(Long _id, String _descripcion) {
		PersistenceManager pm = getPersistenceManager();
		try {
		      Query q = pm.newQuery(Proyecto.class);
		      q.setFilter("id == proyParam");
		      q.declareParameters("Long proyParam");
		      List<Proyecto> resultados = (List<Proyecto>) q.execute(_id);
		      
		      if (resultados.iterator().hasNext()) {
		    	  for (Proyecto proy : resultados) {
			          
			          
			          proy.setDescripcion(_descripcion);
			    	  
			      }
		        } else {
		            // ... no results ...
		        }
		      

		    } finally {
		      pm.close();
		    }	
	}
	
}
